
package com.javazyw.utils.io;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


/**
 * <p>属性文件工具类.</p>
 *
 * @version v1.0
 * @date 2011-10-12
 *
 */
public final class PropUtil {

    /** 获取日志对象. */
    private static Log logger = LogFactory.getLog(PropUtil.class);

    /** 类实例定义. */
    private static PropUtil proertiesUtil;

    /** 每个配置文件的配置对象. */
    private  PropertiesConfiguration pconfig;

    /** 保存已经初始化过得配置文件. */
    private static Map<String, PropUtil> puMap = new HashMap<String, PropUtil>();


    /**
     * 私有构造函数.
     *
     * @param propPath 配置文件 路径
     */
    private PropUtil(String propPath) {
        pconfig = initPropertiesConfig(propPath);
    }


    /**
     * 取得静态页面生成类实例.
     *
     * @param propPath 配置文件的路径
     * @return 页面生成实例
     */
    public static PropUtil getInstance(String propPath) {
        if (puMap.containsKey(propPath)) {
            return puMap.get(propPath);
        } else {
            PropUtil pu = new PropUtil(propPath);
            puMap.put(propPath, pu);
            return pu;
        }
    }

    /**
     * 根据配置文件中得key  取得 其对应的value.
     * 注：此函数取x,y 类型值时，只能取到第一个逗号前边的值
     * @param key  key
     * @return value
     */
    public String getString(String key) {
        if (key == null || "".equals(key)) {
            return "";
        }
        return pconfig.getString(key);
    }

    /**
     * 根据key取得列表集合.
     *
     * @param key 配置文件中key值
     * @return  集合
     */
    public List getList(String key) {
        if (key == null || "".equals(key)) {
            return new ArrayList();
        }
        return pconfig.getList(key);
    }

    /***
     * 取得key值集合.
     * @return 集合
     */
    public Iterator<String> getKeys() {
        return pconfig.getKeys();
    }
    /**
     * 向配置文件中存储或更新值.
     *
     * @param key 存储过更新的key
     * @param value 存储或更新的值
     */
    public void setProperty(String key, String value) {
        if (logger.isDebugEnabled()) {
            logger.debug("向配置文件中存储或更新的key=" + key + "  value=" + value);
        }
        pconfig.setProperty(key, value);
    }
    /**
     * 初始化属性文件配置信息.
     *
     * @param filePath 配置信息.
     * @return 文件配置对象
     */
    private PropertiesConfiguration initPropertiesConfig(String filePath) {
        try {
            PropertiesConfiguration config = new PropertiesConfiguration(filePath);

            // 自动刷新
            config.setReloadingStrategy(new FileChangedReloadingStrategy());
            config.setAutoSave(true);
            return config;
        } catch (ConfigurationException e) {
            e.printStackTrace();
            logger.error("初始化属性文件出错。文件路径：" + filePath);
        }
        return null;
    }

    public PropertiesConfiguration getPropertiesConfiguration() {
        return pconfig;
    }
    /**
     * 主测试函数.
     *
     * @param args 参数
     */
    public static void main(String[] args) {
       /* String  aa = PropUtil.getInstance().getString("group.date_format");
        logger.debug("group.date_format:" + aa);

        String bb = PropUtil.getInstance().getString("sys.dataBasePrefix");
        logger.debug(bb);*/
    	
    	PropUtil p1 =  PropUtil.getInstance("test1.properties");
    	PropUtil p2 =  PropUtil.getInstance("test2.properties");
    	
    	System.out.println(p1.getString("t"));
    	System.out.println(p2.getString("a"));
    	
    }
}
